////
//// Source code recreated from a .class file by IntelliJ IDEA
//// (powered by FernFlower decompiler)
////
//
//package cn.fan.dao;
//
//import com.cdtye.common.mongocore.config.AttrId;
//import com.cdtye.common.mongocore.query.MongoRefs;
//import com.cdtye.common.mongocore.query.Page;
//import com.mongodb.BasicDBList;
//import com.mongodb.client.FindIterable;
//import com.mongodb.client.MongoCollection;
//import com.mongodb.client.MongoCursor;
//import com.mongodb.internal.client.model.FindOptions;
//import io.swagger.annotations.ApiModelProperty;
//import java.io.Serializable;
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Collection;
//import java.util.Date;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Map.Entry;
//import java.util.concurrent.TimeUnit;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.reflect.FieldUtils;
//import org.bson.Document;
//import org.bson.conversions.Bson;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.domain.Sort;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.aggregation.Aggregation;
//import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
//import org.springframework.data.mongodb.core.aggregation.Fields;
//import org.springframework.data.mongodb.core.aggregation.LookupOperation;
//import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
//import org.springframework.data.mongodb.core.aggregation.UnwindOperation;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//
//public abstract class BaseDao<T> {
//    private int defaultMaxRecords = 10000;
//    private static final int YES = 1;
//    private static final int NO = 0;
//    protected Class<T> entityClass = getSuperClassGenricType(this.getClass());
//    @Autowired
//    protected MongoTemplate mongoTemplate;
//
//    public BaseDao() {
//    }
//
//    public void insert(T t) {
//        this.setSaveBase(t, true);
//        this.mongoTemplate.insert(t);
//    }
//
//    public void insert(T t, String collectionName) {
//        this.setSaveBase(t, true);
//        this.mongoTemplate.insert(t, collectionName);
//    }
//
//    public void insert(Document t, String collectionName) {
//        this.mongoTemplate.insert(t, collectionName);
//    }
//
//    public void insert(Collection<T> batchToSave) {
//        batchToSave.forEach((o) -> {
//            this.setSaveBase(o, true);
//        });
//        this.mongoTemplate.insert(batchToSave, this.entityClass);
//    }
//
//    public void insert(Collection<T> batchToSave, String collectionName) {
//        batchToSave.forEach((o) -> {
//            this.setSaveBase(o, true);
//        });
//        this.mongoTemplate.insert(batchToSave, collectionName);
//    }
//
//    public void save(T t) {
//        this.setSaveBase(t, false);
//        this.mongoTemplate.save(t);
//    }
//
//    public void save(T t, String collectionName) {
//        this.setSaveBase(t, false);
//        this.mongoTemplate.save(t, collectionName);
//    }
//
//    public <E> E saveByColl(E e) {
//        this.setSaveBase(e, false);
//        return this.mongoTemplate.save(e, this.getCollectionName(e.getClass()));
//    }
//
//    private <E> void setSaveBase(E t, boolean insertFlag) {
//        try {
//            Date nowDate = new Date();
//            Class clazz = t.getClass();
//            Object updateTime = clazz.getMethod("getUpdateTime").invoke(t);
//            if (updateTime == null) {
//                clazz.getMethod("setUpdateTime", Date.class).invoke(t, nowDate);
//            }
//
//            String id = (String)clazz.getMethod("getId").invoke(t);
//            if (insertFlag || StringUtils.isBlank(id)) {
//                Object createTime = clazz.getMethod("getCreateTime").invoke(t);
//                if (createTime == null) {
//                    clazz.getMethod("setCreateTime", Date.class).invoke(t, nowDate);
//                }
//
//                Object delFlag = clazz.getMethod("getDelFlag").invoke(t);
//                if (delFlag == null) {
//                    clazz.getMethod("setDelFlag", Integer.class).invoke(t, 0);
//                }
//            }
//        } catch (Exception var9) {
//        }
//
//    }
//
//    public int updateFirst(Criteria criteria, Update update) {
//        return (int)this.mongoTemplate.updateFirst(Query.query(criteria), update, this.entityClass).getModifiedCount();
//    }
//
//    public int updateFirst(Query query, Update update) {
//        return (int)this.mongoTemplate.updateFirst(query, update, this.entityClass).getModifiedCount();
//    }
//
//    public int updateFirst(Criteria criteria, Update update, String collectionName) {
//        return (int)this.mongoTemplate.updateFirst(Query.query(criteria), update, collectionName).getModifiedCount();
//    }
//
//    public int updateFirst(Query query, Update update, String collectionName) {
//        return (int)this.mongoTemplate.updateFirst(query, update, collectionName).getModifiedCount();
//    }
//
//    public int updateMulti(Criteria criteria, Update update) {
//        return (int)this.mongoTemplate.updateMulti(Query.query(criteria), update, this.entityClass).getModifiedCount();
//    }
//
//    public int updateMulti(Query query, Update update) {
//        return (int)this.mongoTemplate.updateMulti(query, update, this.entityClass).getModifiedCount();
//    }
//
//    public int updateMulti(Criteria criteria, Update update, String collectionName) {
//        return (int)this.mongoTemplate.updateMulti(Query.query(criteria), update, collectionName).getModifiedCount();
//    }
//
//    public int updateMulti(Query query, Update update, String collectionName) {
//        return (int)this.mongoTemplate.updateMulti(query, update, collectionName).getModifiedCount();
//    }
//
//    public int upsert(Criteria criteria, Update update) {
//        return (int)this.mongoTemplate.upsert(Query.query(criteria), update, this.entityClass).getModifiedCount();
//    }
//
//    public int upsert(Query query, Update update) {
//        return (int)this.mongoTemplate.upsert(query, update, this.entityClass).getModifiedCount();
//    }
//
//    public int upsert(Criteria criteria, Update update, String collectionName) {
//        return (int)this.mongoTemplate.upsert(Query.query(criteria), update, collectionName).getModifiedCount();
//    }
//
//    public int upsert(Query query, Update update, String collectionName) {
//        return (int)this.mongoTemplate.upsert(query, update, collectionName).getModifiedCount();
//    }
//
//    public void updateRef(String arrayIdsName, String id, String foreignId) {
//        if (!StringUtils.isBlank(foreignId)) {
//            Update update = new Update();
//            update.pull(arrayIdsName, foreignId);
//            Query query = Query.query(Criteria.where("delFlag").is(0));
//            this.updateMulti(query, update);
//            if (!StringUtils.isBlank(id)) {
//                update = new Update();
//                update.push(arrayIdsName, foreignId);
//                query = Query.query(Criteria.where("id").is(id));
//                this.updateFirst(query, update);
//            }
//        }
//    }
//
//    public void updateAttr(Class mainClazz, Object attrObj, String attrIdValue, String attrName) {
//        this.updateAttrCommon(mainClazz, attrObj, attrIdValue, attrName);
//    }
//
//    public void updateAttr(Class mainClazz, Object attrObj, String attrIdValue) {
//        this.updateAttrCommon(mainClazz, attrObj, attrIdValue, (String)null);
//    }
//
//    private void updateAttrCommon(Class mainClazz, Object attrObj, String attrIdValue, String attrName) {
//        if (StringUtils.isBlank(attrIdValue)) {
//            throw new RuntimeException("更新条件不能为空");
//        } else {
//            Class<?> objClass = attrObj.getClass();
//            String idFieldName;
//            if (StringUtils.isBlank(attrName)) {
//                idFieldName = objClass.getSimpleName();
//                attrName = idFieldName.substring(0, 1).toLowerCase() + idFieldName.substring(1);
//            }
//
//            idFieldName = this.getAttrIdField(objClass);
//            if (StringUtils.isBlank(idFieldName)) {
//                throw new RuntimeException("未获取到AttrId注解，请检查attr实体");
//            } else {
//                Update update = new Update();
//                update.set(attrName, attrObj);
//                Query query = Query.query(Criteria.where(attrName + "." + idFieldName).is(attrIdValue));
//                this.mongoTemplate.updateMulti(query, update, mainClazz);
//            }
//        }
//    }
//
//    public void updateAttrList(Class mainClazz, Object attrObj, String attrIdValue, String attrName) throws Exception {
//        if (!StringUtils.isBlank(attrName) && !StringUtils.isBlank(attrIdValue)) {
//            Class<?> objClass = attrObj.getClass();
//            Field[] fields = objClass.getDeclaredFields();
//            Update update = new Update();
//            String idFieldName = "";
//            Field[] var9 = fields;
//            int var10 = fields.length;
//
//            for(int var11 = 0; var11 < var10; ++var11) {
//                Field field = var9[var11];
//                if (field.getAnnotation(AttrId.class) != null) {
//                    idFieldName = field.getName();
//                }
//
//                field.setAccessible(true);
//                Object value = field.get(attrObj);
//                update.set(attrName + ".$." + field.getName(), value);
//            }
//
//            if (StringUtils.isBlank(idFieldName)) {
//                throw new RuntimeException("未获取到AttrId注解，请检查attr实体");
//            } else {
//                Query query = Query.query(Criteria.where(attrName + "." + idFieldName).is(attrIdValue));
//                this.mongoTemplate.updateMulti(query, update, mainClazz);
//            }
//        } else {
//            throw new RuntimeException("更新条件或属性名称不能为空");
//        }
//    }
//
//    public int deleteFlagById(Serializable id) {
//        Update update = Update.update("delFlag", 1).set("updateTime", new Date());
//        Query query = Query.query(Criteria.where("id").is(id));
//        return this.updateFirst(query, update);
//    }
//
//    public int deleteFlag(Query query) {
//        Update update = Update.update("delFlag", 1).set("updateTime", new Date());
//        return this.updateMulti(query, update);
//    }
//
//    public int deleteFlag(Query query, String collectionName) {
//        Update update = Update.update("delFlag", 1).set("updateTime", new Date());
//        return this.updateMulti(query, update, collectionName);
//    }
//
//    public int deleteFlag(Criteria criteria) {
//        return this.deleteFlag(Query.query(criteria));
//    }
//
//    public int deleteFlag(Criteria criteria, String collectionName) {
//        return this.deleteFlag(Query.query(criteria), collectionName);
//    }
//
//    public int deleteFlag(T entity) throws Exception {
//        if (entity == null) {
//            throw new RuntimeException("删除对象不存在");
//        } else {
//            Class clazz = entity.getClass();
//            String id = (String)clazz.getMethod("getId").invoke(entity);
//            return this.deleteFlagById(id);
//        }
//    }
//
//    public int deleteById(Serializable id) {
//        T obj = this.findById(id);
//        return obj == null ? 0 : this.delete(obj);
//    }
//
//    public int delete(Criteria criteria) {
//        return this.delete(Query.query(criteria));
//    }
//
//    public int delete(Query query) {
//        return (int)this.mongoTemplate.remove(query, this.entityClass).getDeletedCount();
//    }
//
//    public int delete(Criteria criteria, String collectionName) {
//        return this.delete(Query.query(criteria), collectionName);
//    }
//
//    public int delete(Query query, String collectionName) {
//        return (int)this.mongoTemplate.remove(query, collectionName).getDeletedCount();
//    }
//
//    public int delete(T t) {
//        return (int)this.mongoTemplate.remove(t).getDeletedCount();
//    }
//
//    public int deleteArrayId(Class clazz, String idsName, String id) {
//        Update update = new Update();
//        update.pull(idsName, id);
//        Query query = Query.query(Criteria.where(idsName).is(id));
//        return (int)this.mongoTemplate.updateMulti(query, update, clazz).getModifiedCount();
//    }
//
//    public int delete() {
//        return (int)this.mongoTemplate.remove(new Query(), this.entityClass).getDeletedCount();
//    }
//
//    public int delete(String collectionName) {
//        return (int)this.mongoTemplate.remove(new Query(), collectionName).getDeletedCount();
//    }
//
//    public T findById(Serializable id) {
//        Query query = new Query(Criteria.where("_id").is(id));
//        return this.mongoTemplate.findOne(query, this.entityClass);
//    }
//
//    public <P> P findCollById(Class<P> entityClass, Serializable id) {
//        Query query = new Query(Criteria.where("_id").is(id));
//        return this.mongoTemplate.findOne(query, entityClass, this.getCollectionName(entityClass));
//    }
//
//    public T findOne(Criteria criteria) {
//        return this.mongoTemplate.findOne(Query.query(criteria), this.entityClass);
//    }
//
//    public T findOne(Criteria criteria, Sort sort) {
//        Query query = Query.query(criteria);
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.findOne(query, this.entityClass);
//    }
//
//    public T findOne(Query query) {
//        return this.mongoTemplate.findOne(query, this.entityClass);
//    }
//
//    public T findOne(Query query, Sort sort) {
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.findOne(query, this.entityClass);
//    }
//
//    public <P> P findOne(Criteria criteria, Class<P> entityClass) {
//        return this.mongoTemplate.findOne(Query.query(criteria), entityClass);
//    }
//
//    public <P> P findOne(Query query, Class<P> entityClass) {
//        return this.mongoTemplate.findOne(query, entityClass);
//    }
//
//    public <P> P findOne(Class<P> poClass, Criteria criteria, Sort sort) {
//        Query query = Query.query(criteria);
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.findOne(query, poClass, this.getCollectionName(this.entityClass));
//    }
//
//    public <P> P findOne(Class<P> poClass, Criteria criteria, String collectionName) {
//        return this.mongoTemplate.findOne(Query.query(criteria), poClass, collectionName);
//    }
//
//    public <P> P findOne(Class<P> poClass, Query query, String collectionName) {
//        return this.mongoTemplate.findOne(query, poClass, collectionName);
//    }
//
//    public <P> P findCollOne(Class<P> entityClass, Criteria criteria, Sort sort) {
//        Query query = Query.query(criteria);
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.findOne(query, entityClass, this.getCollectionName(entityClass));
//    }
//
//    public List<T> findAll(Criteria criteria) {
//        return this.mongoTemplate.find(Query.query(criteria), this.entityClass);
//    }
//
//    public List<T> findAll(Query query) {
//        return this.mongoTemplate.find(query, this.entityClass);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria) {
//        return this.mongoTemplate.find(Query.query(criteria), poClass, this.getCollectionName(this.entityClass));
//    }
//
//    public <P> List<P> findCollAll(Class<P> entityClass, Criteria criteria) {
//        return this.mongoTemplate.find(Query.query(criteria), entityClass, this.getCollectionName(entityClass));
//    }
//
//    public <P> List<P> findCollAll(Class<P> entityClass, Criteria criteria, Sort sort) {
//        Query query = Query.query(criteria);
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.find(query, entityClass, this.getCollectionName(entityClass));
//    }
//
//    public <P> List<P> findCollPage(Class<P> entityClass, Criteria criteria, BaseVo vo) {
//        Query query = Query.query(criteria);
//        this.setPage(query, vo);
//        return this.mongoTemplate.find(query, entityClass, this.getCollectionName(entityClass));
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Query query) {
//        return this.mongoTemplate.find(query, poClass, this.getCollectionName(this.entityClass));
//    }
//
//    public List<T> findAll(Criteria criteria, Sort sort) {
//        return this.findAll(Query.query(criteria), sort);
//    }
//
//    public List<T> findAll(Query query, Sort sort) {
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.find(query, this.entityClass);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, Sort sort) {
//        return this.findAll(poClass, Query.query(criteria), sort);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Query query, Sort sort) {
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.find(query, poClass, this.getCollectionName(this.entityClass));
//    }
//
//    public List<T> findAll(Criteria criteria, BaseVo vo) {
//        return this.findAll(Query.query(criteria), vo);
//    }
//
//    public List<T> findAll(Query query, BaseVo vo) {
//        this.setPage(query, vo);
//        return this.mongoTemplate.find(query, this.entityClass);
//    }
//
//    public <P> List<P> findAll(Criteria criteria, Class<P> entityClass) {
//        return this.mongoTemplate.find(Query.query(criteria), entityClass);
//    }
//
//    public <P> List<P> findAll(Query query, Class<P> entityClass) {
//        return this.mongoTemplate.find(query, entityClass);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Criteria criteria) {
//        return this.mongoTemplate.find(Query.query(criteria), poClass, collectionName);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Query query) {
//        return this.mongoTemplate.find(query, poClass, collectionName);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Criteria criteria, Sort sort) {
//        return this.findAll(poClass, collectionName, Query.query(criteria), sort);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Query query, Sort sort) {
//        if (sort != null) {
//            query.with(sort);
//        }
//
//        return this.mongoTemplate.find(query, poClass, collectionName);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Criteria criteria, BaseVo vo) {
//        return this.findAll(poClass, collectionName, Query.query(criteria), vo);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, String collectionName, Query query, BaseVo vo) {
//        this.setPage(query, vo);
//        return this.mongoTemplate.find(query, poClass, collectionName);
//    }
//
//    public List<Map> findAllMap(String collectionName, Criteria criteria) {
//        return this.findAll(Map.class, collectionName, Query.query(criteria));
//    }
//
//    public List<Map> findAllMap(String collectionName, Criteria criteria, BaseVo vo) {
//        return this.findAll(Map.class, collectionName, Query.query(criteria), vo);
//    }
//
//    public List<Document> findAll(String collectionName, Bson filter, FindOptions findOptions) {
//        List<Document> list = null;
//        MongoCollection<Document> coll = this.mongoTemplate.getCollection(collectionName);
//        if (coll != null) {
//            FindIterable docs;
//            if (filter != null) {
//                docs = coll.find(filter);
//            } else {
//                docs = coll.find();
//            }
//
//            if (findOptions != null) {
//                if (findOptions.getSkip() > 0) {
//                    docs.skip(findOptions.getSkip());
//                }
//
//                if (findOptions.getLimit() > 0) {
//                    docs.limit(findOptions.getLimit());
//                }
//
//                if (findOptions.getSort() != null) {
//                    docs.sort(findOptions.getSort());
//                }
//
//                if (findOptions.getProjection() != null) {
//                    docs.projection(findOptions.getProjection());
//                }
//
//                if (findOptions.getBatchSize() > 0) {
//                    docs.batchSize(findOptions.getBatchSize());
//                }
//
//                if (findOptions.getCursorType() != null) {
//                    docs.cursorType(findOptions.getCursorType());
//                }
//
//                if (findOptions.getMaxAwaitTime(TimeUnit.MILLISECONDS) > 0L) {
//                    docs.maxAwaitTime(findOptions.getMaxAwaitTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS);
//                }
//
//                if (findOptions.getMaxTime(TimeUnit.MILLISECONDS) > 0L) {
//                    docs.maxTime(findOptions.getMaxTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS);
//                }
//            } else {
//                docs.limit(this.defaultMaxRecords);
//            }
//
//            if (docs != null) {
//                list = new ArrayList();
//                MongoCursor<Document> it = docs.iterator();
//                if (it != null) {
//                    while(it.hasNext()) {
//                        list.add(it.next());
//                    }
//                }
//            }
//        }
//
//        if (list == null) {
//            list = new ArrayList(0);
//        }
//
//        return list;
//    }
//
//    private void setPage(Query query, BaseVo vo) {
//        if (vo.getSort() != null) {
//            query.with(vo.getSort());
//        }
//
//        query.skip((long)vo.getPageSkip());
//        query.limit(vo.getSize());
//    }
//
//    public Page<T> findPage(Criteria criteria, BaseVo vo) {
//        return this.findPage(Query.query(criteria), vo);
//    }
//
//    public Page<T> findPage(Query query, BaseVo vo) {
//        long count = this.count(query);
//        this.setPage(query, vo);
//        List<T> datas = this.mongoTemplate.find(query, this.entityClass);
//        return new Page(datas, count, vo);
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, Criteria criteria, BaseVo vo) {
//        Query query = Query.query(criteria);
//        return this.findPage(poClass, query, vo);
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, Query query, BaseVo vo) {
//        long count = this.count(query);
//        this.setPage(query, vo);
//        List datas = this.mongoTemplate.find(query, poClass, this.getCollectionName(this.entityClass));
//        return new Page(datas, count, vo);
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, String collectionName, Criteria criteria, BaseVo vo) {
//        return this.findPage(poClass, collectionName, Query.query(criteria), vo);
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, String collectionName, Query query, BaseVo vo) {
//        long count = this.count(query, collectionName);
//        this.setPage(query, vo);
//        List datas = this.mongoTemplate.find(query, poClass, collectionName);
//        return new Page(datas, count, vo);
//    }
//
//    public Page<Map> findPageMap(String collectionName, Criteria criteria, BaseVo vo) {
//        return this.findPage(Map.class, collectionName, criteria, vo);
//    }
//
//    public <P> List<P> aggregate(Aggregation aggregation, String collectionName, Class<P> poClass) {
//        return this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//    }
//
//    public <P> List<P> findAllTO(Class<P> poClass, Criteria criteria, Class fromClass, String localField, String unwindName) {
//        return this.findAllTO(poClass, criteria, fromClass, localField, unwindName, (Sort)null);
//    }
//
//    public <P> List<P> findAllTO(Class<P> poClass, Criteria criteria, Class fromClass, String localField, String unwindName, Sort sort) {
//        String collectionName = this.getCollectionName(poClass.getSuperclass());
//        String rlCollectionName = this.getCollectionName(fromClass);
//        List<AggregationOperation> agoList = this.getAggregationTO(poClass, criteria, rlCollectionName, localField, unwindName);
//        if (sort != null) {
//            agoList.add(Aggregation.sort(sort));
//        }
//
//        Aggregation aggregation = Aggregation.newAggregation(agoList);
//        return this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//    }
//
//    public <P> List<P> findAllTM(Class<P> poClass, Criteria criteria, Class fromClass, String foreignField, String rlListName) {
//        return this.findAllTM(poClass, criteria, fromClass, foreignField, rlListName, (Sort)null);
//    }
//
//    public <P> List<P> findAllTM(Class<P> poClass, Criteria criteria, Class fromClass, String foreignField, String rlListName, Sort sort) {
//        List<MongoRefs> rlList = Arrays.asList(new MongoRefs(fromClass, (String)null, foreignField, rlListName, false));
//        return this.findAll(poClass, criteria, rlList, sort);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, MongoRefs refModel) {
//        return this.findAll(poClass, criteria, Arrays.asList(refModel));
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, MongoRefs refModel, Sort sort) {
//        return this.findAll(poClass, criteria, Arrays.asList(refModel), sort);
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, List<MongoRefs> rlList) {
//        String collectionName = this.getCollectionName(poClass.getSuperclass());
//        List<AggregationOperation> agoList = this.getAggregationTMO(poClass, criteria, rlList);
//        Aggregation aggregation = Aggregation.newAggregation(agoList);
//        return this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, List<MongoRefs> rlList, Sort sort) {
//        String collectionName = this.getCollectionName(poClass.getSuperclass());
//        List<AggregationOperation> agoList = this.getAggregationTMO(poClass, criteria, rlList);
//        if (sort != null) {
//            agoList.add(Aggregation.sort(sort));
//        }
//
//        Aggregation aggregation = Aggregation.newAggregation(agoList);
//        return this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//    }
//
//    public <P> List<P> findAll(Class<P> poClass, Criteria criteria, List<MongoRefs> rlList, BaseVo vo) {
//        String collectionName = this.getCollectionName(poClass.getSuperclass());
//        List<AggregationOperation> agoList = this.getAggregationTMO(poClass, criteria, rlList);
//        if (vo.getSort() != null) {
//            agoList.add(Aggregation.sort(vo.getSort()));
//        }
//
//        agoList.addAll(vo.getPageAgo());
//        Aggregation aggregation = Aggregation.newAggregation(agoList);
//        return this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, Criteria criteria, List<MongoRefs> rlList, BaseVo vo) {
//        List<AggregationOperation> agoList = this.getAggregationTMO(poClass, criteria, rlList);
//        return this.findPageCommon(poClass, criteria, agoList, vo);
//    }
//
//    public <P> Page<P> findPageTO(Class<P> poClass, Criteria criteria, Class fromClass, String localField, String unwindName, BaseVo vo) {
//        String rlCollectionName = this.getCollectionName(fromClass);
//        List<AggregationOperation> agoList = this.getAggregationTO(poClass, criteria, rlCollectionName, localField, unwindName);
//        return this.findPageCommon(poClass, criteria, agoList, vo);
//    }
//
//    public <P> Page<P> findPageTM(Class<P> poClass, Criteria criteria, Class fromClass, String foreignField, String rlListName, BaseVo vo) {
//        List<MongoRefs> rlList = Arrays.asList(new MongoRefs(fromClass, (String)null, foreignField, rlListName, false));
//        return this.findPage(poClass, criteria, rlList, vo);
//    }
//
//    public <P> Page<P> findPage(Class<P> poClass, Criteria criteria, MongoRefs refModel, BaseVo vo) {
//        return this.findPage(poClass, criteria, Arrays.asList(refModel), vo);
//    }
//
//    public long count(Query query) {
//        return this.mongoTemplate.count(query, this.entityClass);
//    }
//
//    public long count(Criteria criteria) {
//        return this.mongoTemplate.count(Query.query(criteria), this.entityClass);
//    }
//
//    public long count(Query query, String collectionName) {
//        return this.mongoTemplate.count(query, collectionName);
//    }
//
//    public long count(Criteria criteria, String collectionName) {
//        return this.mongoTemplate.count(Query.query(criteria), collectionName);
//    }
//
//    public long count(Class poClass, String collectionName, Criteria criteria, List<AggregationOperation> agoList) {
//        if (this.getRefFlag(criteria)) {
//            Aggregation countAgo = Aggregation.newAggregation(agoList);
//            return (long)this.mongoTemplate.aggregate(countAgo, collectionName, poClass).getMappedResults().size();
//        } else {
//            Query query = Query.query(criteria);
//            return this.mongoTemplate.count(query, poClass.getSuperclass());
//        }
//    }
//
//    private List<AggregationOperation> getAggregationTO(Class poClass, Criteria criteria, String fromCollection, String localField, String unwindName) {
//        if (criteria == null) {
//            criteria = BaseVo.initCriteria();
//        }
//
//        if (StringUtils.isBlank(unwindName)) {
//            unwindName = "rl";
//        }
//
//        LookupOperation lookup = LookupOperation.newLookup().from(fromCollection).localField(localField).foreignField("_id").as(unwindName);
//        ProjectionOperation project = Aggregation.project(this.listAllField(poClass));
//        UnwindOperation unwind = Aggregation.unwind(unwindName, true);
//        List<AggregationOperation> agoList = new ArrayList();
//        agoList.add(lookup);
//        agoList.add(unwind);
//        agoList.add(Aggregation.match(criteria));
//        agoList.add(project);
//        return agoList;
//    }
//
//    private List<AggregationOperation> getAggregationTMO(Class poClass, Criteria criteria, List<MongoRefs> rlList) {
//        if (criteria == null) {
//            criteria = BaseVo.initCriteria();
//        }
//
//        List<AggregationOperation> agoList = new ArrayList();
//        Iterator var5 = rlList.iterator();
//
//        while(var5.hasNext()) {
//            MongoRefs mr = (MongoRefs)var5.next();
//            String from = StringUtils.isBlank(mr.getFromCollName()) ? this.getCollectionName(mr.getFromClass()) : mr.getFromCollName();
//            String localField = StringUtils.isBlank(mr.getLocalField()) ? "_id" : mr.getLocalField();
//            String foreignField = StringUtils.isBlank(mr.getForeignField()) ? "_id" : mr.getForeignField();
//            String unwindName = StringUtils.isBlank(mr.getUnwindName()) ? "rl" : mr.getUnwindName();
//            LookupOperation lookup = LookupOperation.newLookup().from(from).localField(localField).foreignField(foreignField).as(unwindName);
//            agoList.add(lookup);
//            if (mr.isOneRefFlag()) {
//                UnwindOperation unwind = Aggregation.unwind(unwindName, true);
//                agoList.add(unwind);
//            }
//        }
//
//        ProjectionOperation project = Aggregation.project(this.listAllField(poClass));
//        agoList.add(Aggregation.match(criteria));
//        agoList.add(project);
//        return agoList;
//    }
//
//    private <P> Page<P> findPageCommon(Class<P> poClass, Criteria criteria, List<AggregationOperation> agoList, BaseVo vo) {
//        String collectionName = this.getCollectionName(poClass.getSuperclass());
//        long count = this.count(poClass, collectionName, criteria, agoList);
//        if (vo.getSort() != null) {
//            agoList.add(Aggregation.sort(vo.getSort()));
//        }
//
//        agoList.addAll(vo.getPageAgo());
//        Aggregation aggregation = Aggregation.newAggregation(agoList);
//        List<P> datas = this.mongoTemplate.aggregate(aggregation, collectionName, poClass).getMappedResults();
//        return new Page(datas, count, vo);
//    }
//
//    private Fields listAllField(Class clazz) {
//        List<org.springframework.data.mongodb.core.aggregation.Field> fieldList = new ArrayList();
//        Field[] fields = FieldUtils.getAllFields(clazz);
//        Field[] var4 = fields;
//        int var5 = fields.length;
//
//        for(int var6 = 0; var6 < var5; ++var6) {
//            Field field = var4[var6];
//            ApiModelProperty amp = (ApiModelProperty)field.getAnnotation(ApiModelProperty.class);
//            String fieldName = field.getName();
//            if (amp != null && StringUtils.isNotBlank(amp.name())) {
//                fieldList.add(Fields.field(fieldName, amp.name()));
//            } else {
//                fieldList.add(Fields.field(fieldName));
//            }
//        }
//
//        return Fields.from((org.springframework.data.mongodb.core.aggregation.Field[])fieldList.toArray(new org.springframework.data.mongodb.core.aggregation.Field[fieldList.size()]));
//    }
//
//    public boolean getRefFlag(Criteria criteria) {
//        boolean refFlag = false;
//        Map<String, Object> docs = criteria.getCriteriaObject();
//        Iterator var4 = docs.entrySet().iterator();
//
//        label39:
//        while(var4.hasNext()) {
//            Entry<String, Object> entry = (Entry)var4.next();
//            if (!(entry.getValue() instanceof BasicDBList)) {
//                if (((String)entry.getKey()).contains(".")) {
//                    refFlag = true;
//                    break;
//                }
//            } else {
//                List<Map<String, Object>> cdocs = (List)entry.getValue();
//                Iterator var7 = cdocs.iterator();
//
//                while(true) {
//                    while(true) {
//                        if (!var7.hasNext()) {
//                            continue label39;
//                        }
//
//                        Map<String, Object> cdoc = (Map)var7.next();
//                        Iterator var9 = cdoc.entrySet().iterator();
//
//                        while(var9.hasNext()) {
//                            Entry<String, Object> centry = (Entry)var9.next();
//                            if (((String)centry.getKey()).contains(".")) {
//                                refFlag = true;
//                                break;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        return refFlag;
//    }
//
//    private Query getQueryByObject(T object) {
//        Query query = new Query();
//        String[] fileds = getFiledNames(object);
//        Criteria criteria = new Criteria();
//
//        for(int i = 0; i < fileds.length; ++i) {
//            String filedName = fileds[i];
//            Object filedValue = getFieldValueByName(filedName, object);
//            if (filedValue != null) {
//                criteria.and(filedName).is(filedValue);
//            }
//        }
//
//        query.addCriteria(criteria);
//        return query;
//    }
//
//    private Update getUpdateByObject(T object) {
//        Update update = new Update();
//        String[] fileds = getFiledNames(object);
//
//        for(int i = 0; i < fileds.length; ++i) {
//            String filedName = fileds[i];
//            Object filedValue = getFieldValueByName(filedName, object);
//            if (filedValue != null) {
//                update.set(filedName, filedValue);
//            }
//        }
//
//        return update;
//    }
//
//    private static String[] getFiledNames(Object o) {
//        Field[] fields = o.getClass().getFields();
//        String[] fieldNames = new String[fields.length];
//
//        for(int i = 0; i < fields.length; ++i) {
//            fieldNames[i] = fields[i].getName();
//        }
//
//        return fieldNames;
//    }
//
//    private static Object getFieldValueByName(String fieldName, Object o) {
//        try {
//            String e = fieldName.substring(0, 1).toUpperCase();
//            String getter = "get" + e + fieldName.substring(1);
//            Method method = o.getClass().getMethod(getter);
//            return method.invoke(o);
//        } catch (Exception var5) {
//            return null;
//        }
//    }
//
//    public static <T> Class<T> getSuperClassGenricType(Class clazz) {
//        return getSuperClassGenricType(clazz, 0);
//    }
//
//    public static Class getSuperClassGenricType(Class clazz, int index) {
//        Type genType = clazz.getGenericSuperclass();
//        if (!(genType instanceof ParameterizedType)) {
//            return Object.class;
//        } else {
//            Type[] params = ((ParameterizedType)genType).getActualTypeArguments();
//            if (index < params.length && index >= 0) {
//                return !(params[index] instanceof Class) ? Object.class : (Class)params[index];
//            } else {
//                return Object.class;
//            }
//        }
//    }
//
//    public String getCollectionName(Class clazz) {
//        org.springframework.data.mongodb.core.mapping.Document doc = (org.springframework.data.mongodb.core.mapping.Document)clazz.getDeclaredAnnotation(org.springframework.data.mongodb.core.mapping.Document.class);
//        return doc.collection();
//    }
//
//    private String getAttrIdField(Class<?> objClass) {
//        String idFieldName = "";
//        Field[] var3 = objClass.getDeclaredFields();
//        int var4 = var3.length;
//
//        for(int var5 = 0; var5 < var4; ++var5) {
//            Field field = var3[var5];
//            if (field.getAnnotation(AttrId.class) != null) {
//                idFieldName = field.getName();
//                break;
//            }
//        }
//
//        return idFieldName;
//    }
//}
